package com.aiwiown.face.domain;

import com.aiwiown.face.ApiObject;
import com.aiwiown.face.domain.params.*;
import com.aiwiown.face.internal.mapping.ApiField;

import java.io.File;

/**
 * <pre>
 *     Lite-GetToken
 * </pre>
 * LiteToken
 * Date: 2020/4/23 0023
 * Time: 14:01
 *
 * @author tang.xiaosheng@qq.com
 */
public class LiteTokenModel extends ApiObject {

    private static final long serialVersionUID = -7410079771391271494L;

    /**
     * 用户完成或取消验证后网页跳转的目标URL。（回调方法为Post）
     */
    @ApiField("return_url")
    private String returnUrl;

    /**
     * 用户完成验证、取消验证、或验证超时后，由FaceID服务器请求客户服务器的URL。（推荐为HTTPS页面，如果为HTTP则用户需要通过签名自行校验数据可信性，回调方法为Post）
     * <p>
     * 注：出于安全性考虑，FaceID服务对服务器端回调端口有白名单要求，支持的端口有：443，5000，16003，8883，8028
     */
    @ApiField("notify_url")
    private String notifyUrl;

    /**
     * “默认为空”。客户业务流水号，建议设置为您的业务相关的流水串号并且唯一，会在return时原封不动的返回给您的服务器，以帮助您确认对应业务的归属。此字段不超过128字节。
     */
    @ApiField("biz_no")
    private String bizNo;

    /**
     * 在调用notify_url和return_url时会返回的额外数据，用户可以用此接口来传递一些额外信息，以帮助您调试和信息传递。此字段不超过4096字节。
     */
    @ApiField("biz_extra_data")
    private String bizExtraData;

    /**
     * 验证网页展示用的标题文字。此字段不超过32字节，但考虑到显示效果，建议控制在10个中文字符以内。
     * <p>
     * 此参数默认为空，此时系统将采用默认的标题。
     * <p>
     * 请注意，如果您设置了scene_id参数、或者在控制台里设置了默认的场景，它对应的场景配置将覆盖您此处的设定。
     */
    @ApiField("web_title")
    private String webTitle;

    /**
     * 在控制台配置的对应使用场景的scene_id，用以自定义验证流程中的视觉元素。
     * <p>
     * 如果不传此参数，则选择在控制台中设置的默认scene；
     * <p>
     * 如果控制台中没有设定任何scene，则采用系统默认方案；
     * <p>
     * 如果传入了不存在的scene_id，调用将失败且返回错误码400（BAD_ARGUMENTS）。
     */
    @ApiField("scene_id")
    private String sceneId;

    /**
     * 刷脸活体验证流程的选择。目前仅取以下值：
     * <p>
     * "video"：通过自拍有声视频方式进行活体验证
     * "selfie"：通过两张自拍方式进行活体验证
     * 本参数默认值为“video”。
     */
    @ApiField(value = "procedure_type", paramType = ApiParamType.ENUM)
    private ProcedureType procedureType;

    /**
     * 本参数可选，通过一系列配置项来调节活体检测的严格度。目前可用的选项有：
     * “none”：表示没有特别的选项，此为默认值。
     * "selfie_no_metadata_check"：（仅precedure_type == “selfie”时有效）表示不限定照片格式为JPG、也不校验照片的元信息，此设置会降低安全性。
     * "video_strict"：（仅precedure_type == “video”时有效）表示针对上传的视频进行相对严格的活体检测，此设置会提高安全性，但在一定程度上影响通过率。
     * 注意：设置其他值，均会返回400（BAD_ARGUMENTS）。
     */
    @ApiField(value = "liveness_preferences", paramType = ApiParamType.ENUM)
    private LivenessPreferences livenessPreferences;

    /**
     * 确定本次比对为“KYC验证”或“人脸比对”。取值只为“1”或“0”，取其他值返回错误码400（BAD_ARGUMENTS）。
     * “1”表示KYC验证，表示最终的用户自拍照片将于参考照片比对。
     * “0”表示人脸比对，FaceID将使用用户自己提供的照片（参数image_ref[x]）作为比对人脸照。
     * <p>
     * 请注意：
     * <p>
     * 本参数影响验证流程中是否存在身份证拍摄环节：如果为“1”，则可选择包含身份证拍摄；如果为“0”，验证流程中将没有身份证拍摄。
     * 本参数取什么值将决定下面“二选一”参数组使用哪一组参数。
     */
    @ApiField(value = "comparison_type", paramType = ApiParamType.ENUM)
    private ComparisonType comparisonType;
    /**
     * 传递参数“0”，“1”，“2”，“3”或“4”，表示获取用户身份证信息的方法。传递其他值调用将识别，返回错误码400（BAD_ARGUMENTS）。
     * <p>
     * 0：不拍摄身份证，而是通过 idcard_name / idcard_number 参数传入；
     * <p>
     * 1：仅拍摄身份证人像面，可获取人像面所有信息；
     * <p>
     * 2：拍摄身份证人像面和身份证国徽面，可获取身份证所有信息；
     * <p>
     * 3：不拍摄身份证，但会要求用户在界面上输入身份证号和姓名；
     * <p>
     * 4：拍摄身份证人像面或用户输入身份证号和姓名，用户可在界面上自行选择身份证录入方法。注意：该参数只有在控制台中选择使用“浅色主题”时才生效，若未应用浅色主题而传入4，则返回错误码400（BAD_ARGUMENTS）。
     */
    @ApiField(value = "idcard_mode", paramType = ApiParamType.ENUM)
    private IdcardMode idCardMode;

    /**
     * 选择用户不可编辑的字段。当选择拍摄身份证来获取上面的文字信息时，会由于OCR算法的问题导致文字识别不准确（如：生僻字、形近字），通过该参数可以限制用户对识别得到的结果进行编辑。（如：身份证号的识别都是准确的，可以限制用户不能编辑此字段）。
     * <p>
     * 目前可以选为不可修改的字段有 姓名（idcard_name），身份证号（idcard_number），身份证有效期（idcard_valid_date），签发机关（idcard_issued_by）。传递参数时用逗号隔开，可以同时设置多个参数。例子：idcard_uneditable_field=idcard_number,idcard_valid_date 表示身份证号和过期时间都不可编辑，如果尝试编辑则会提示需要重新拍摄。传入其他值或格式不对，本次调用将失败，返回错误码400（BAD_ARGUMENTS）。
     * <p>
     * 本参数默认值为空，表示所有字段都可以编辑。
     * <p>
     * 请注意，如果您设置了scene_id参数、或者在控制台里设置了默认的场景，它对应的场景配置里将覆盖您此处的设定。
     */
    @ApiField("idcard_uneditable_field")
    private String idCardUneditableField;

    /**
     * idcard_name， 需要KYC验证对象的姓名，使用UTF-8编码；
     * <p>
     * idcard_mode = 0 时，这两个参数必须传；在其他情况下可以不传，即使传递了也不会使用。
     */
    @ApiField("idcard_name")
    private String idCardName;

    /**
     * idcard_number， 需要KYC验证对象的身份证号，也就是一个18位长度的字符串。
     */
    @ApiField("idcard_number")
    private String idCardNumber;

    /**
     * 多张由您自己提供的参照人脸照片。x表示此参数可重复多次，其中1 <= x <= 2，即表示可以传最多二张参照人脸照片（参数分别为image_ref1, image_ref2）。
     * <p>
     * 如果在image_ref1、image_ref2中的任一张图片里没有找到人脸，将返回错误码400（NO_FACE_FOUND)；
     * <p>
     * 如果这些图片中任一张中有多张脸，将返回错误码400（MULTIPLE_FACES）。
     */
    @ApiField(value = "image_ref1", paramType = ApiParamType.FILE)
    private File imageRef1;

    /**
     * 多张由您自己提供的参照人脸照片。x表示此参数可重复多次，其中1 <= x <= 2，即表示可以传最多二张参照人脸照片（参数分别为image_ref1, image_ref2）。
     * <p>
     * 如果在image_ref1、image_ref2中的任一张图片里没有找到人脸，将返回错误码400（NO_FACE_FOUND)；
     * <p>
     * 如果这些图片中任一张中有多张脸，将返回错误码400（MULTIPLE_FACES）。
     */
    @ApiField(value = "image_ref2", paramType = ApiParamType.FILE)
    private File imageRef2;

    /**
     * 如果用户不使用参考数据进行比对，则上传此字段，用于标志本次识别对应的用户的唯一ID，要求不长于128字节。建议您对来自同一用户的比对请求使用同样的ID，这非常有利于您反查验证结果以及获得更好的监控报表体验
     */
    @ApiField("uuid")
    private String uuid;

    /**
     * 决定对于image_ref[x]参数对应的图片，当检测不出人脸时，是否旋转90度、180度、270度后再检测人脸。本参数取值只能是 “1” 或 "0" ；
     * <p>
     * 1：默认值，要旋转检测
     * 0：不旋转
     * 其他值：返回错误码400（BAD_ARGUMENTS）
     * <p>
     * 注意：设置此参数为1可能会轻微增加误检人脸的概率，如果您明确您的业务场景里不存在非正向的人脸图片、或概率极低，建议勿设置此参数。
     */
    @ApiField(value = "multi_oriented_detection", paramType = ApiParamType.ENUM)
    private MultiOrientedDetection multiOrientedDetection;

    /**
     * 决定在活体检测结果中，是否进行云端假脸攻击判断，默认值为1。
     * <p>
     * 1：在活体检测结果中，不进行云端假脸攻击判断（合成脸、面具攻击、屏幕翻拍），但返回假脸攻击具体分数。您可以根据自身业务需要，结合云端假脸攻击具体分数设计后续流程。
     * 0：在活体检测结果中，判断云端假脸攻击情况。
     * 注：活体检测结果，请参见“Lite-GetResult”返回值的“liveness_result”段落。
     */
    @ApiField(value = "fmp_mode", paramType = ApiParamType.ENUM)
    private FmpMode fmpMode;

    public String getReturnUrl() {
        return returnUrl;
    }

    public void setReturnUrl(String returnUrl) {
        this.returnUrl = returnUrl;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }

    public String getBizNo() {
        return bizNo;
    }

    public void setBizNo(String bizNo) {
        this.bizNo = bizNo;
    }

    public String getBizExtraData() {
        return bizExtraData;
    }

    public void setBizExtraData(String bizExtraData) {
        this.bizExtraData = bizExtraData;
    }

    public String getWebTitle() {
        return webTitle;
    }

    public void setWebTitle(String webTitle) {
        this.webTitle = webTitle;
    }

    public String getSceneId() {
        return sceneId;
    }

    public void setSceneId(String sceneId) {
        this.sceneId = sceneId;
    }

    public ProcedureType getProcedureType() {
        return procedureType;
    }

    public void setProcedureType(ProcedureType procedureType) {
        this.procedureType = procedureType;
    }

    public LivenessPreferences getLivenessPreferences() {
        return livenessPreferences;
    }

    public void setLivenessPreferences(LivenessPreferences livenessPreferences) {
        this.livenessPreferences = livenessPreferences;
    }

    public ComparisonType getComparisonType() {
        return comparisonType;
    }

    public void setComparisonType(ComparisonType comparisonType) {
        this.comparisonType = comparisonType;
    }

    public IdcardMode getIdCardMode() {
        return idCardMode;
    }

    public void setIdCardMode(IdcardMode idCardMode) {
        this.idCardMode = idCardMode;
    }

    public String getIdCardUneditableField() {
        return idCardUneditableField;
    }

    public void setIdCardUneditableField(String idCardUneditableField) {
        this.idCardUneditableField = idCardUneditableField;
    }

    public String getIdCardName() {
        return idCardName;
    }

    public void setIdCardName(String idCardName) {
        this.idCardName = idCardName;
    }

    public String getIdCardNumber() {
        return idCardNumber;
    }

    public void setIdCardNumber(String idCardNumber) {
        this.idCardNumber = idCardNumber;
    }

    public File getImageRef1() {
        return imageRef1;
    }

    public void setImageRef1(File imageRef1) {
        this.imageRef1 = imageRef1;
    }

    public File getImageRef2() {
        return imageRef2;
    }

    public void setImageRef2(File imageRef2) {
        this.imageRef2 = imageRef2;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public MultiOrientedDetection getMultiOrientedDetection() {
        return multiOrientedDetection;
    }

    public void setMultiOrientedDetection(MultiOrientedDetection multiOrientedDetection) {
        this.multiOrientedDetection = multiOrientedDetection;
    }

    public FmpMode getFmpMode() {
        return fmpMode;
    }

    public void setFmpMode(FmpMode fmpMode) {
        this.fmpMode = fmpMode;
    }
}
